T004 自定义控件 由远及近 ImageView

参考知识点:ScaleAnimationBounceInterpolator

借助 ScaleAnimation 实现由远及近效果,首先需要让动画从控件某点(触屏点)为中心开始缩放;其次需要在动画结束后,将控件固定在放大后的状态;并使用回弹插值器。

上述效果图完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.xxt.xtest;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.Animation;
import android.view.animation.BounceInterpolator;
import android.view.animation.ScaleAnimation;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
public class TouchImageView extends AppCompatImageView {
private boolean isPlay = false;
public TouchImageView(Context context) {
super(context);
}
public TouchImageView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public TouchImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isPlay) {
isPlay = true;
float pivotXValue = (event.getX() - getLeft()) / getWidth();
float pivotYValue = (event.getY() - getTop()) / getHeight();
ScaleAnimation scaleAnim = new ScaleAnimation(1.0f, 3f, 1.0f, 3f,
Animation.RELATIVE_TO_SELF, pivotXValue,
Animation.RELATIVE_TO_SELF, pivotYValue);
scaleAnim.setDuration(3000);
scaleAnim.setFillAfter(true);
scaleAnim.setInterpolator(new BounceInterpolator());
this.startAnimation(scaleAnim);
} else {
this.clearAnimation();
isPlay = false;
}
return super.onTouchEvent(event);
}
}

之所以继承 ImageView,是为了复用其完善的图片显示功能。